package com.tianji.common.autoconfigure.mybatis;


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass({MybatisPlusInterceptor.class, BaseMapper.class})
public class MybatisConfig {

    /**
     * @deprecated 存在任务更新数据导致updater写入0或null的问题，暂时废弃
     * @see MyBatisAutoFillInterceptor 通过自定义拦截器来实现自动注入creater和updater
     */
    // @Bean
    // @ConditionalOnMissingBean
    public BaseMetaObjectHandler baseMetaObjectHandler() {
        return new BaseMetaObjectHandler();
    }

    /**
     * 配置 MyBatis-Plus 核心拦截器链（插件集合）
     * 注意拦截器执行顺序：表名动态处理 > 多租户 > 分页 > 乐观锁 > 字段自动填充
     *
     * @param dynamicTableNameInnerInterceptor 动态表名拦截器（可选）
     * @return 配置好的拦截器实例
     */
    @Bean
    @ConditionalOnMissingBean
    public MybatisPlusInterceptor mybatisPlusInterceptor(
            @Autowired(required = false) DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor
    ) {
        // 1. 创建拦截器容器（执行顺序由添加顺序决定）
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 2. 动态表名拦截器（需要各微服务自行定义）
        if (null != dynamicTableNameInnerInterceptor) {
            interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor); // 处理动态表名替换
        }

        // 3. 分页插件配置（MySQL方言）
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(200L); // 设置单页最大记录数限制（200条）
        interceptor.addInnerInterceptor(paginationInnerInterceptor); // 添加分页支持

        // 4. 字段自动填充拦截器（自定义实现）
        interceptor.addInnerInterceptor(new MyBatisAutoFillInterceptor()); // 自动填充create_time/update_time等字段

        return interceptor;
    }
}
